/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.codeplex.boomships.Common;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 *
 * @author fleischer
 */
public class BattleShip implements Serializable {

	protected static final long serialVersionUID = 1L;
	protected Boolean orientation;
	protected Random ran;
	protected int cellsCount;
	protected List<Cell> lstCells;

	public BattleShip() {
		this.lstCells = new ArrayList<Cell>();
		this.ran = new Random();
	}

	public BattleShip(List<Cell> lstC) {
		this.lstCells = lstC;
	}

	public void setRandomPositions(List<Cell> lstTakenCells) {
		int x = 0;
		int y = 0;
		Boolean valid = false;
		// Primero se setea la posicion(horizontal o vertical.(True para
		// Horizontal y False para Vertical)).
		orientation = getRandomBoolean();
		if (orientation == true) {// Horizontal
			while (!valid) {
				// Se generan las coordenadas de la primera posicion.
				x = getRandomInt(Constants.BOARD_SIZE - cellsCount + 1);
				y = getRandomInt(Constants.BOARD_SIZE);
				// Se validan las posiciones obtenidas para que no se repitan
				// con las de otras naves creadas.
				valid = validatePositions(lstTakenCells, orientation, x, y);
			}
			// Se asignan las coordenadas correspondientes a cada posicion de la
			// nave.
			for (int i = 0; i < cellsCount; i++) {
				Cell c = new Cell(CellState.SHIP, (x + i), y);
				this.lstCells.add(c);
			}
		} else {// Vertical
			while (!valid) {
				// Se generan las coordenadas de la primera posicion.
				x = getRandomInt(Constants.BOARD_SIZE);
				y = getRandomInt(Constants.BOARD_SIZE - cellsCount + 1);
				// Se validan las posiciones obtenidas para que no se repitan
				// con las de otras naves creadas.
				valid = validatePositions(lstTakenCells, orientation, x, y);
			}
			// Se asignan las coordenadas correspondientes a cada posicion de la
			// nave.
			for (int i = 0; i < cellsCount; i++) {
				Cell c = new Cell(CellState.SHIP, x, (y + i));
				this.lstCells.add(c);
			}
		}

	}

	// Recibe como parametro la lista de celdas ocupadas, la orientacion que va
	// a tener la nave y su celda inicial.
	protected Boolean validatePositions(List<Cell> lstTakenCells,
			Boolean orientation, int coordX, int coordY) {
		Boolean valid = true;
		// Si la lista de posiciones ocupadas no es nula y si la primera
		// posicion de la misma no lo es tampoco:
		if (lstTakenCells != null && lstTakenCells.get(0) != null) {
			int i = 0;
			int j = 0;
			if (orientation == true) {// Si la orientacion es horizontal:
				while (valid != false && i < lstTakenCells.size()) {
					Cell c = lstTakenCells.get(i);
					while (valid != false && j < cellsCount) {
						if (coordY == c.getPositionY()
								&& (coordX + j) == c.getPositionX()) {
							valid = false;
						}
						j++;
					}
					j = 0;
					i++;
				}
			} else {// Si la orientacion es vertical:
				while (valid != false && i < lstTakenCells.size()) {
					Cell c = lstTakenCells.get(i);
					while (valid != false && j < cellsCount) {
						if (coordX == c.getPositionX()
								&& (coordY + j) == c.getPositionY()) {
							valid = false;
						}
						j++;
					}
					j = 0;
					i++;
				}
			}
		}
		return valid;
	}

	protected Boolean getRandomBoolean() {
		return ran.nextBoolean();
	}

	protected int getRandomInt(int limit) {
		return ran.nextInt(limit);
	}
}
